메모리 디버거
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
메모리 디버거는 메모리 접근, 할당 및 해제를 모니터링하여 메모리 관련 오류를 찾아내는 도구이다. 응용 프로그램을 재컴파일하거나 가상 머신 환경에서 실행하여 메모리 누수, 잘못된 메모리 접근과 같은 문제를 감지하며, 소프트웨어의 신뢰성을 높이는 데 기여한다. 정적 분석 도구와 함께 사용하면 더욱 효과적인 디버깅이 가능하다. 주요 도구로는 Valgrind, AddressSanitizer, Visual Studio Debugger 등이 있다.
더 읽어볼만한 페이지
- 메모리 관리 소프트웨어 - 프리페처
프리페처는 윈도우 운영체제에서 응용 프로그램 실행 패턴 분석을 통해 필요한 데이터를 미리 로드하여 시스템 부팅 및 프로그램 실행 속도를 향상시키는 기능이다. - 메모리 관리 소프트웨어 - Mimalloc
Mimalloc은 Microsoft에서 개발한 고성능 메모리 할당기로, 다양한 운영체제와 하드웨어 아키텍처를 지원하며 다중 스레드 환경에서 메모리 할당 및 해제 속도 향상에 초점을 맞추어 설계되었고 MIT 라이선스로 제공된다. - 디버깅 - 스택 추적
스택 추적은 프로그램 실행 중 함수 호출 기록을 추적하여 오류 발생 시 디버깅 및 문제 해결에 필수적인 도구로, 호출 스택의 스택 프레임을 분석하여 프로그램 실행 경로를 파악하고 오류 원인을 추적하며 프로그램 안정성을 향상시키는 기술이다. - 디버깅 - 브레이크포인트
브레이크포인트는 프로그램 디버깅 시 특정 지점에서 실행을 중단시키는 기술 또는 지점으로, 케이블 제거에서 유래하여 대화형 디버깅 환경으로 발전했으며, 명령, 데이터, 조건부 브레이크포인트 등 다양한 종류가 있고 프로그램 상태 조사 및 변경 도구와 함께 사용되며, 하드웨어나 소프트웨어 방식으로 구현될 수 있다.
메모리 디버거 | |
---|---|
개요 | |
종류 | 디버거 |
용도 | 메모리 관련 문제 진단 및 수정 |
기능 | |
주요 기능 | 메모리 누수 탐지 메모리 손상 탐지 유효하지 않은 메모리 접근 탐지 |
부가 기능 | 메모리 사용량 분석 메모리 할당 패턴 분석 힙 상태 분석 |
디버깅 지원 | 중단점 설정 메모리 내용 검사 및 수정 콜 스택 추적 변수 값 추적 |
사용법 | |
일반적인 사용 단계 | |
사용 환경 | 개발 환경 테스트 환경 운영 환경 (제한적) |
장점 및 단점 | |
장점 | 메모리 관련 문제의 근본적인 원인 파악 가능 프로그램 안정성 향상 개발 효율성 향상 |
단점 | 사용법 습득에 시간 소요 성능 저하 발생 가능성 오탐(False Positive) 가능성 |
종류 | |
상용 메모리 디버거 | Valgrind Purify Dr. Memory Memcheck (Valgrind의 일부) |
오픈 소스 메모리 디버거 | AddressSanitizer (ASan) MemorySanitizer (MSan) LeakSanitizer (LSan) ThreadSanitizer (TSan) |
고려 사항 | |
메모리 디버거 선택 기준 | 지원하는 프로그래밍 언어 및 플랫폼 성능 기능 사용 편의성 가격 (상용 제품의 경우) |
주의 사항 | 메모리 디버거는 완벽하지 않으며, 모든 메모리 관련 문제를 탐지하지 못할 수 있음 오탐(False Positive)에 주의 성능에 미치는 영향을 고려하여 사용 |
2. 메모리 디버거의 작동 원리
메모리 디버거는 프로그램의 메모리 사용을 분석하여 잠재적인 문제점을 찾아낸다. 비정상적으로 높은 메모리 사용은 소프트웨어 노후화의 원인이 될 수 있으므로, 메모리 디버거는 프로그래머가 소프트웨어 버그를 방지하고 장시간 런타임 동안 소프트웨어의 높은 신뢰성을 보장하도록 돕는다.[1]
2. 1. 메모리 할당 및 해제 추적
메모리 디버거는 메모리 접근, 할당 및 해제를 모니터링한다. 많은 메모리 디버거는 애플리케이션이 API들이 기존의 동적 메모리 할당 라이브러리와 호환되거나 동적 링킹을 사용하는 특별한 동적 메모리 할당 라이브러리로 재컴파일되기를 요구한다. Electric Fence는 malloc으로 메모리 할당을 디버깅하는 디버거이다. Valgrind 같은 몇몇 메모리 디버거는 가상 머신과 유사한 환경에서 실행 파일을 실행하고 메모리 접근, 할당 및 해제를 모니터링하여 특별한 메모리 할당 라이브러리로 재컴파일할 필요가 없다.[1]메모리 누수와 같은 메모리 문제를 찾는 것은 특정 조건에서만 나타날 수 있으므로 매우 시간이 많이 걸릴 수 있다. 메모리 오용을 감지하는 도구를 사용하면 이 과정을 훨씬 빠르고 쉽게 만들 수 있다.[1]
2. 2. 메모리 접근 감시
메모리 디버거는 메모리 접근, 할당 및 해제를 감시한다. 많은 메모리 디버거는 응용 프로그램이 기존의 동적 메모리 할당 라이브러리와 호환되거나 동적 링킹을 사용하는 특수 동적 메모리 할당 라이브러리로 재컴파일되기를 요구한다. Electric Fence는 malloc으로 메모리 할당을 디버그하는 디버거이다.[1] Valgrind 같은 몇몇 메모리 디버거는 가상 머신과 같은 환경에서 실행 파일을 실행하고 메모리 접근, 할당 및 해제를 감시하여 특수 메모리 할당 라이브러리로 재컴파일할 필요가 없다.[1]2. 3. 특수 라이브러리 및 가상 머신
Electric Fence와 같이 특수 메모리 할당 라이브러리를 사용하여 오류를 탐지하는 방식이 있다.[1] Electric Fence는 malloc으로 메모리 할당을 디버그한다.[1] Valgrind 같은 몇몇 메모리 디버거들은 가상 머신과 유사한 환경에서 실행 파일을 실행하여 메모리 접근, 할당 및 해제를 모니터링하므로, 특수 메모리 할당 라이브러리로 재컴파일할 필요가 없다.[1]3. 정적 분석 도구와의 비교
정적 분석 도구는 코드를 실행하지 않고 분석하여 메모리 오류를 찾을 수 있다. 반면 메모리 디버거는 애플리케이션 실행 중에 작동한다. 이 두 기술은 서로 다른 문제점을 발견할 수 있으므로 함께 사용하면 더 좋은 결과를 얻을 수 있다.[2]
3. 1. 정적 분석 도구의 장단점
정적 분석 도구는 코드를 실행하지 않고 분석하여 메모리 오류를 찾을 수 있다는 장점이 있다. 이러한 특징 덕분에 애플리케이션 실행 전에 잠재적인 오류를 발견할 수 있다.[2]하지만 정적 분석 도구는 실제 실행 환경에서만 발생하는 오류를 놓칠 수 있다는 단점도 존재한다. 메모리 디버거는 애플리케이션 실행 중에 작동하는 반면, 정적 분석은 실행 없이 코드를 분석하기 때문이다.[2] 따라서 두 가지 기술을 함께 사용하면 최상의 결과를 얻을 수 있다.[2]
3. 2. 메모리 디버거의 장단점
메모리 디버거는 메모리 접근, 할당 및 할당 해제를 모니터링하여 프로그래머가 소프트웨어 버그를 피하고, 긴 런타임 동안 소프트웨어의 높은 신뢰성을 보장하도록 돕는다.[2] Valgrind와 같은 일부 메모리 디버거는 가상 머신 환경에서 실행 파일을 실행하여 메모리 접근, 할당 및 해제를 모니터링하므로, 특별한 메모리 할당 라이브러리로 재컴파일할 필요가 없다.메모리 디버거는 애플리케이션이 실행되는 동안 애플리케이션의 일부로 작동하는 반면, 정적 코드 분석은 코드를 실행하지 않고 분석하여 수행된다.[2] 이 두 가지 기술은 서로 다른 문제 인스턴스를 찾을 수 있으며, 두 가지를 함께 사용하면 최상의 결과를 얻을 수 있다.[2]
3. 3. 상호 보완적인 활용
정적 분석 도구는 메모리 오류를 찾는 데 도움을 줄 수 있다. 메모리 디버거는 애플리케이션이 실행되는 동안 애플리케이션의 일부로 작동하지만, 정적 코드 분석은 코드를 실행하지 않고 분석한다. 이 두 기술은 서로 다른 문제점을 찾을 수 있으므로, 함께 사용하면 더 좋은 결과를 얻을 수 있다.[2]4. 메모리 디버깅 도구 목록
메모리 디버깅 도구는 다양한 운영체제, 프로그래밍 언어 및 라이선스 형태로 제공된다.[1]
이름 | 운영체제 | 라이선스 | 언어 | 기법 |
---|---|---|---|---|
AddressSanitizer영어 | 리눅스, 맥 OS | 자유/오픈 소스 (LLVM) | C, C++ | 컴파일 타임 인스트루먼테이션 (클랭 및 GCC에서 사용 가능), 특수 라이브러리 |
Allinea DDT영어 | 리눅스, AIX, Blue Gene | 사유/상용 | C, C++, F90, 슈퍼컴퓨터 병렬 프로그램 | 런타임 (동적 링킹 시) |
Alloclave | 윈도우 | 사유/상용 | C++ | 컴파일 타임 |
AQtime영어 | 윈도우 (비주얼 스튜디오, Embarcadero IDEs) | 사유/상용 | .NET, C++, Java, Silverlight, JScript, VBScript[9] | 런타임 |
Bcheck영어 | 솔라리스 | |||
BoundsChecker영어 | 윈도우 (비주얼 스튜디오) | 사유/상용 | C++ | 런타임 인터셉트 또는 컴파일 타임 |
checker | 리눅스, 솔라리스 | 자유/오픈 소스 (GPL) | C | 컴파일 타임 오버라이드 |
Daikon영어 | 유닉스, 윈도우, 맥 OS X[10] | 자유/오픈 소스[11] | Java, C/C++, Perl, Eiffel[10] | 런타임 동적 불변성 감지 |
Debug_new영어 | (일반 기술) | (일반 기술) | C++ | 컴파일 타임 오버라이드 |
Deleaker | 윈도우 (비주얼 스튜디오) | 사유/상용 | C, C++ | 런타임 인터셉트 |
dmalloc영어 | Any | 자유/오픈 소스 | C | 컴파일 타임 오버라이드 |
dlmalloc영어[12] | Any | 자유/오픈 소스 (public domain) | C | 컴파일 타임 오버라이드 |
Dr Memory | 윈도우, 리눅스 | 자유/오픈 소스 (LGPL) | C, C++ | 런타임 |
Duma | 유닉스, 윈도우 | 자유/오픈 소스 (GPL) | C, C++ | 컴파일 타임 오버라이드 |
Electric Fence영어 | 유닉스 | 자유/오픈 소스 (GPL) | C, C++ | 컴파일 타임 오버라이드 |
graprof | GNU/리눅스 | 자유/오픈 소스 (GPL) | C, C++ | 링크 타임 오버라이드 |
HP Wildebeest (WDB)[13] | gdb 기반 | |||
IBM OLIVER | IBM System/360/370/390 | 사유/상용 | 어셈블리어, 코볼, PL/I | |
IBM Rational Purify | 유닉스, 윈도우 | 사유/상용 | C++, Java, .NET | 런타임 |
Insure++영어 | 윈도우 (비주얼 스튜디오 플러그인), 유닉스 | 사유/상용 | C, C++ | |
Intel Parallel Inspector | 윈도우 (비주얼 스튜디오) | 사유/상용 | C, C++ | |
libcwd영어 | 리눅스 (gcc) | 자유/오픈 소스 | C, C++ | 컴파일 타임 오버라이드 |
libumem영어 | 솔라리스 | 솔라리스 번들 | 링크 타임 오버라이드 | |
MemCheck영어 (Hal Duston)[14] | 유닉스, 맥 OS X | 자유/오픈 소스 (GPL) | C, C++ | 컴파일 타임 오버라이드 |
Memcheck영어 (Société Générale)[15][16] | 윈도우 (볼랜드 델파이) | 자유/오픈 소스 | C, C++ | 컴파일 타임 오버라이드 |
DDDebug[17] | 윈도우 (볼랜드 델파이) | 상용 | Delphi (5 to XE7) | 런타임 |
MemPro영어[18] | 윈도우 (비주얼 스튜디오) | Free beta | C++ | 컴파일 타임 오버라이드, TCP 연결 (메모리 이벤트 추적) |
Memwatch영어 | Any (프로그래밍 라이브러리) | 자유/오픈 소스 | C | 컴파일 타임 오버라이드 |
mpatrol영어[19] | 유닉스, 윈도우 | 자유/오픈 소스 (LGPL) | C, C++ | |
mtrace영어 | 다양한 | 자유/오픈 소스 (LGPL) | GNU C 라이브러리 | 빌트인, 결과 접근 |
MTuner영어 | 다양한 | 사유/상용 | C, C++ | 런타임 인터셉트, 링크 타임 오버라이드 (MSVC, Clang and GCC), 누수 탐지 |
ocp-memprof[20] | 리눅스 64 | 사유/오픈 소스 | OCaml | 컴파일 타임 |
Oracle Solaris Studio | 리눅스, 솔라리스 | 사유 프리웨어 | C, C++, 포트란 | |
OpenPAT영어[21][22] | Any | 프리 (등록 필요) | C, C++, 자바, 포트란 등 | 컴파일 타임 인스트루먼테이션, 런타임 인터셉트 |
softwareverify[23] | 윈도우 | 사유 상용 | .NET, C, C++, 자바, 자바스크립트, Lua, 파이썬, 루비, VMs | 런타임 |
Splint영어 | Any | 자유/오픈 소스 (GPL) | C | 정적 프로그램 분석 |
TotalView영어 | 유닉스, 맥 OS X | 사유/상용 | C, C++, 포트란 | 런타임 |
Valgrind | 리눅스, 맥 OS, 안드로이드 | 자유/오픈 소스 (GPL) | Any | 런타임 인터셉트 |
Visual Leak Detector영어[24] | 윈도우 (비주얼 스튜디오) | 자유/오픈 소스 (LGPL) | C, C++ | 컴파일 타임 오버라이드, 누수 탐지 |
WinDbg | 윈도우 | 사유 프리웨어 | C, C++, .NET, 파이썬 | 런타임 |
D Profiler[25] | 윈도우 | 자유/오픈 소스 | C, C++ | 런타임 |
4. 1. 주요 도구 목록
메모리 디버깅을 할 때 유용한 도구들의 목록이다. 프로파일러는 메모리 디버거와 함께 사용될 수 있다.이름 | 운영체제 | 라이선스 | 언어 | 기법 |
---|---|---|---|---|
AddressSanitizer영어 | 리눅스, 맥 OS | 자유/오픈 소스 (LLVM) | C, C++ | 컴파일 타임 인스트루먼테이션 (클랭 및 GCC에서 사용 가능), 특수 라이브러리 |
Allinea DDT영어 | 리눅스, AIX, Blue Gene | 사유/상용 | C, C++, F90, 슈퍼컴퓨터 병렬 프로그램 | 런타임 (동적 링킹 시) |
[http://www.alloclave.com Alloclave] | 윈도우 | 사유/상용 | C++ | 컴파일 타임 |
AQtime영어 | 윈도우 (비주얼 스튜디오, Embarcadero IDEs) | 사유/상용 | .NET, C++, Java, Silverlight, JScript, VBScript[9] | 런타임 |
Bcheck영어 | 솔라리스 | |||
BoundsChecker영어 | 윈도우 (비주얼 스튜디오) | 사유/상용 | C++ | 런타임 인터셉트 또는 컴파일 타임 |
checker | 리눅스, 솔라리스 | 자유/오픈 소스 (GPL) | C | 컴파일 타임 오버라이드 |
Daikon영어 | 유닉스, 윈도우, 맥 OS X[10] | 자유/오픈 소스[11] | Java, C/C++, Perl, Eiffel[10] | 런타임 동적 불변성 감지 |
Debug_new영어 | (일반 기술) | (일반 기술) | C++ | 컴파일 타임 오버라이드 |
[http://deleaker.com Deleaker] | 윈도우 (비주얼 스튜디오) | 사유/상용 | C, C++ | 런타임 인터셉트 |
dmalloc영어 | Any | 자유/오픈 소스 | C | 컴파일 타임 오버라이드 |
dlmalloc영어[12] | Any | 자유/오픈 소스 (public domain) | C | 컴파일 타임 오버라이드 |
[http://code.google.com/p/drmemory/ Dr Memory] | 윈도우, 리눅스 | 자유/오픈 소스 (LGPL) | C, C++ | 런타임 |
Duma | 유닉스, 윈도우 | 자유/오픈 소스 (GPL) | C, C++ | 컴파일 타임 오버라이드 |
Electric Fence영어 | 유닉스 | 자유/오픈 소스 (GPL) | C, C++ | 컴파일 타임 오버라이드 |
[https://web.archive.org/web/20131213083234/http://graprof.grapentin.org/ graprof] | GNU/리눅스 | 자유/오픈 소스 (GPL) | C, C++ | 링크 타임 오버라이드 |
HP Wildebeest (WDB)[13] | gdb 기반 | |||
IBM OLIVER | IBM System/360/370/390 | 사유/상용 | 어셈블리어, 코볼, PL/I | |
IBM Rational Purify | 유닉스, 윈도우 | 사유/상용 | C++, Java, .NET | 런타임 |
Insure++영어 | 윈도우 (비주얼 스튜디오 플러그인), 유닉스 | 사유/상용 | C, C++ | |
Intel Parallel Inspector | 윈도우 (비주얼 스튜디오) | 사유/상용 | C, C++ | |
libcwd영어 | 리눅스 (gcc) | 자유/오픈 소스 | C, C++ | 컴파일 타임 오버라이드 |
libumem영어 | 솔라리스 | 솔라리스 번들 | 링크 타임 오버라이드 | |
MemCheck영어 (Hal Duston)[14] | 유닉스, 맥 OS X | 자유/오픈 소스 (GPL) | C, C++ | 컴파일 타임 오버라이드 |
Memcheck영어 (Société Générale)[15][16] | 윈도우 (볼랜드 델파이) | 자유/오픈 소스 | C, C++ | 컴파일 타임 오버라이드 |
DDDebug[17] | 윈도우 (볼랜드 델파이) | 상용 | Delphi (5 to XE7) | 런타임 |
MemPro영어[18] | 윈도우 (비주얼 스튜디오) | Free beta | C++ | 컴파일 타임 오버라이드, TCP 연결 (메모리 이벤트 추적) |
Memwatch영어 | Any (프로그래밍 라이브러리) | 자유/오픈 소스 | C | 컴파일 타임 오버라이드 |
mpatrol영어[19] | 유닉스, 윈도우 | 자유/오픈 소스 (LGPL) | C, C++ | |
mtrace영어 | 다양한 | 자유/오픈 소스 (LGPL) | GNU C 라이브러리 | 빌트인, 결과 접근 |
MTuner영어 | 다양한 | 사유/상용 | C, C++ | 런타임 인터셉트, 링크 타임 오버라이드 (MSVC, Clang and GCC), 누수 탐지 |
ocp-memprof[20] | 리눅스 64 | 사유/오픈 소스 | OCaml | 컴파일 타임 |
Oracle Solaris Studio | 리눅스, 솔라리스 | 사유 프리웨어 | C, C++, 포트란 | |
OpenPAT영어[21][22] | Any | 프리 (등록 필요) | C, C++, 자바, 포트란 등 | 컴파일 타임 인스트루먼테이션, 런타임 인터셉트 |
softwareverify[23] | 윈도우 | 사유 상용 | .NET, C, C++, 자바, 자바스크립트, Lua, 파이썬, 루비, VMs | 런타임 |
Splint영어 | Any | 자유/오픈 소스 (GPL) | C | 정적 프로그램 분석 |
TotalView영어 | 유닉스, 맥 OS X | 사유/상용 | C, C++, 포트란 | 런타임 |
Valgrind | 리눅스, 맥 OS, 안드로이드 | 자유/오픈 소스 (GPL) | Any | 런타임 인터셉트 |
Visual Leak Detector영어[24] | 윈도우 (비주얼 스튜디오) | 자유/오픈 소스 (LGPL) | C, C++ | 컴파일 타임 오버라이드, 누수 탐지 |
WinDbg | 윈도우 | 사유 프리웨어 | C, C++, .NET, 파이썬 | 런타임 |
D Profiler[25] | 윈도우 | 자유/오픈 소스 | C, C++ | 런타임 |
4. 2. 한국에서 주로 사용되는 도구
도구 이름 | 운영 체제 | 라이선스 | 대상 언어 | 기술 |
---|---|---|---|---|
AddressSanitizer | 리눅스, 맥 OS | 자유/오픈 소스 (LLVM) | C, C++, Rust | 컴파일 시간 계측 (Clang 및 GCC에서 사용 가능) 및 특수 라이브러리 |
Valgrind|발그라인드영어 | 리눅스, Mac OS, 안드로이드 | 자유/오픈 소스 (GPL) | 임의 | 런타임 인터셉트 |
WinDbg | 윈도우 | 독점 프리웨어 | C, C++, .NET, Python | 런타임 |
- '''AddressSanitizer''': Clang 및 GCC 컴파일러에 내장되어 있어 사용하기 편리하다. 리눅스와 맥 OS에서 사용할 수 있다.
- '''Valgrind''': 리눅스 환경에서 널리 사용되는 오픈 소스 메모리 디버거이다.
- '''Visual Studio Debugger''': 윈도우 환경에서 Visual Studio를 사용하는 경우, 강력한 디버깅 기능을 제공하는 도구이다. (Visual Studio Debugger는 원문에 없지만 요약에 언급되어 추가)
참조
[1]
웹사이트
Review: 5 memory debuggers for Linux coding
http://www.computerw[...]
'20 November 2015'
2017-08-24
[2]
웹사이트
Dynamic Analysis vs. Static Analysis
https://software.int[...]
2017-08-24
[3]
웹사이트
'Managed Code - AQtime Pro | SmartBear'
https://web.archive.[...]
2013-01-14
[4]
웹사이트
The Daikon Invariant Detector User Manual
http://groups.csail.[...]
[5]
웹사이트
The Daikon Invariant Detector User Manual
http://groups.csail.[...]
[6]
URL
http://smartbear.com[...]
[7]
URL
http://groups.csail.[...]
[8]
URL
http://groups.csail.[...]
[9]
웹인용
보관된 사본
https://web.archive.[...]
2015-12-24
[10]
URL
http://groups.csail.[...]
[11]
URL
http://groups.csail.[...]
[12]
웹인용
보관된 사본
https://web.archive.[...]
2015-12-24
[13]
웹인용
보관된 사본
http://h71028.www7.h[...]
2015-12-24
[14]
웹인용
Memcheck - Memory Checker
https://web.archive.[...]
2015-12-24
[15]
URL
http://v.mahon.free.[...]
[16]
문서
Denis Golovan Fork
https://code.launchp[...]
[17]
URL
http://ddobjects.de/
[18]
URL
http://www.puredevso[...]
[19]
URL
http://mpatrol.sourc[...]
[20]
URL
http://memprof.typer[...]
[21]
URL
OpenPAT: The Open Performance Analysis Toolkit
http://www.OpenPAT.o[...]
[22]
문서
OpenPAT: Analyzing Programs the Easy Way
http://www.openpat.o[...]
[23]
URL
http://www.softwarev[...]
[24]
웹인용
보관된 사본
https://web.archive.[...]
2015-12-24
[25]
URL
https://github.com/x[...]
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com